package references

import (
	"JVM/Jvmgo/GoToJVM/instructions/base"
	"JVM/Jvmgo/GoToJVM/runtimeData"
	"JVM/Jvmgo/GoToJVM/runtimeData/heap"
)

/*
该指令需要两个操作数：
1. uint16类型索引 (通过索引可以从当前类的运行时常量池中找到一个类符号引用)
2. 对象引用
*/

type INSTANCE_OF struct {
	base.Index16Instruction
}

func (self *INSTANCE_OF) Execute(frame *runtimeData.Frame) {
	stack := frame.OperandStack()
	ref := stack.PopRef()
	if ref == nil {
		// 如果 a instanceof b 中， a为null，那么无论b如何都会返回null
		stack.PushInt(0)
		return
	}

	cp := frame.Method().Class().ConstantPool()
	classRef := cp.GetConstant(self.Index).(*heap.ClassRef)
	class := classRef.ResolvedClass()
	if ref.IsInstanceOf(class) {
		stack.PushInt(1)
	} else {
		stack.PushInt(0)
	}
}
